ECSのタスク起動時に「standard_init_linux.go」関連のエラーが出た場合の対処方法
こんにちは!DA(データアナリティクス)事業本部 インテグレーション部の大高です。
先日、ECSでタスクの起動をしようとした際に以下のエラーが発生しました。
standard_init_linux.go:219: exec user process caused: no such file or directory
このエラーを調べてみると、いくつか同じようなパターンとその対処方法が見つかったので、まとめておきたいと思います。
いつエラーが起きるのか
ECSのタスクを起動した直後にエラーが発生し、タスクがすぐに「STOPPED」になります。停止したタスクのログを調べると以下のようなログだけが出ている、という状況です。
standard_init_linux.go:219: exec user process caused: no such file or directory
エラーパターン
その1. exec user process caused: no such file or directory
こちらは私が遭遇したエラーです。エラーの原因と対処方法は以下の通りとなります。
前提
Dockefileで以下のようにCMD
を指定しています。
(...snip...) CMD /usr/local/bin/foo-bar
foo-barは以下のように定義されたPythonスクリプトです。
#!/usr/local/bin/python import os import base64 (...snip...)
エラー発生フロー
調査した結果、以下のようなエラーの発生フローでした。
- Dockerfile の
CMD
が呼び出される CMD
に指定されたプログラムfoo-bar
が呼び出され、Shebangで指定したインタプリタで実行しようとする- エラーが発生
エラーの原因
原因は「Shebangで指定した/usr/local/bin/python
が存在しなかったため」でした。エラーメッセージの「no such file or directory」がまさにこれを示していますね。
今回エラーが発生した環境では、Dockerfileで指定するベースイメージを「これまで利用していたベースイメージ」から「別のベースイメージ」に変更を行っていました。このため、Pythonの実行パスが変わりエラーが発生した、という状況でした。
対処方法
対処方法はとても簡単で、Shebangの指定を正しいものに修正するだけでした。
今回のケースでは環境によって変わる絶対パスを指定していたのが要因の1つでもあったので、以下のようにenvを利用するように変更して対処しました。
#!/usr/bin/env python
python
コマンドの実行時に「Pythonの バージョン2 と バージョン3 のどちらが動くか分からない」という環境では問題がありますが、「どちらもバージョン3が動く」というような環境であれば上記で良さそうです。
なお、今回遭遇したエラーはこのケースだったのですが、同様のエラーパターンとしていくつかあるようなので、以下にまとめておきたいと思います。
その2. (別パターン)exec user process caused: no such file or directory
こちらは上記の派生?パターンです。
エラーの原因
ファイルの改行コードがLF
ではなくCRLF
になっていた、というパターンです。これは上記と関連していてENTRYPOINT
やCMD
で指定したファイルにおけるインタプリタの解釈が、改行コードによって阻害されて失敗したケースです。
対処方法
このケースではインタプリタの指定は問題ないので、単純にファイルの改行コードをLF
に修正するのみとなります。
参考
その3. exec user process caused "exec format error"
こちらは「exec format error」が表示されるパターンになります。
エラーの原因
イメージをビルドしたマシンと、コンテナを実行するマシンのCPUアーキテクチャが異なるために発生するエラーです。これはエラーメッセージから直感的に理解しやすいですね。
対処方法
このケースでは、可能であればアーキテクチャを合わせることで解消できます。
参考
その4. (別パターン)exec user process caused "exec format error"
こちらは「exec format error」が表示されるが、ちょっと分かりにくいパターンです。
エラーの原因
ENTRYPOINT
やCMD
で指定したファイルで「Shebangを指定していなかった」場合に起きるエラーです。これはちょっとエラーメッセージからは推測しづらいですね。
対処方法
対処方法としては、ENTRYPOINT
やCMD
で指定したファイルでShebangを指定してあげて、インタプリタを明示してあげれば良いですね。
参考
まとめ
以上、ECSのタスクコンテナ起動で「standard_init_linux.go」関連のエラーが出た場合の対処方法をまとめてみました。
調査したところでは、このエラーは主に上記の4パターンに分類されそうです。同様のエラーが発生して困ったときに、なにかの参考になったら嬉しいです。
どなたかのお役に立てば幸いです。それでは!